package customer

import (
	"counter-help/admin/server/global"
	"counter-help/admin/server/model/customer"
	"time"
)

type PageViewService struct{}

// RecordPageView 记录页面访问
func (s *PageViewService) RecordPageView(ip, path, userAgent string) error {
	// 检查是否存在相同IP对同一页面的访问记录
	var existingView customer.PageView

	err := global.GVA_DB.Where("ip = ? AND path = ?", ip, path).First(&existingView).Error
	if err == nil {
		// 如果找到记录，检查是否在5分钟内
		if time.Since(existingView.LastView) < 5*time.Minute {
			// 5分钟内的重复访问，不记录
			return nil
		}
		// 更新最后访问时间
		return global.GVA_DB.Model(&existingView).Update("last_view", time.Now()).Error
	}

	// 创建新的访问记录
	pageView := customer.PageView{
		IP:        ip,
		Path:      path,
		UserAgent: userAgent,
		LastView:  time.Now(),
	}

	return global.GVA_DB.Create(&pageView).Error
}

// GetPageViewStats 获取页面访问统计
func (s *PageViewService) GetPageViewStats() (map[string]int64, error) {
	var results []struct {
		Path  string
		Count int64
	}

	err := global.GVA_DB.Model(&customer.PageView{}).
		Select("path, COUNT(DISTINCT ip) as count").
		Group("path").
		Find(&results).Error

	if err != nil {
		return nil, err
	}

	stats := make(map[string]int64)
	for _, result := range results {
		stats[result.Path] = result.Count
	}

	return stats, nil
}

// GetTotalPageViews 获取总访问量
func (s *PageViewService) GetTotalPageViews() (int64, error) {
	var total int64

	// 统计所有不同IP的访问总量
	err := global.GVA_DB.Model(&customer.PageView{}).
		Distinct("ip").
		Count(&total).Error

	if err != nil {
		return 0, err
	}

	return total, nil
}
